package com.apikey.auth.service;

import com.apikey.auth.entity.AccessLog;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.Optional;

/**
 * 访问日志服务接口
 * 提供访问日志的管理和查询功能
 *
 * @author API Key Framework
 * @version 1.0
 */
public interface AccessLogService {

    /**
     * 记录访问日志
     *
     * @param accessLog 访问日志信息
     * @return 保存的访问日志
     */
    AccessLog logAccess(AccessLog accessLog);

    /**
     * 根据ID查找访问日志
     *
     * @param id 访问日志ID
     * @return 访问日志
     */
    Optional<AccessLog> findById(Long id);

    /**
     * 分页查询访问日志
     *
     * @param apiKeyValue API Key值
     * @param clientIp    客户端IP
     * @param status      状态码
     * @param method      请求方法
     * @param startTime   开始时间
     * @param endTime     结束时间
     * @param pageable    分页参数
     * @return 分页结果
     */
    Page<AccessLog> findAccessLogs(String apiKeyValue, String clientIp, Integer status,
                                   String method, LocalDateTime startTime, LocalDateTime endTime,
                                   Pageable pageable);

    /**
     * 获取总访问次数
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 总访问次数
     */
    long getTotalCount(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 获取成功访问次数
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 成功访问次数
     */
    long getSuccessfulCount(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 获取错误访问次数
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 错误访问次数
     */
    long getErrorCount(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 获取平均响应时间
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 平均响应时间（毫秒）
     */
    double getAverageResponseTime(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 获取访问趋势数据
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param interval  时间间隔
     * @return 趋势数据
     */
    Map<String, Object> getAccessTrends(LocalDateTime startTime, LocalDateTime endTime, String interval);

    /**
     * 获取状态码分布
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 状态码分布
     */
    Map<String, Object> getStatusDistribution(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 清理历史访问日志
     *
     * @param retentionDays 保留天数
     * @return 清理的记录数
     */
    int cleanupOldAccessLogs(int retentionDays);

    /**
     * 多条件分页查询访问日志
     *
     * @param apiKeyId       API Key ID过滤
     * @param startTime      开始时间
     * @param endTime        结束时间
     * @param clientIp       客户端IP过滤
     * @param responseStatus 响应状态过滤
     * @param pageable       分页参数
     * @return 访问日志分页结果
     */
    Page<AccessLog> getAccessLogs(Long apiKeyId, LocalDateTime startTime, LocalDateTime endTime,
                                  String clientIp, Integer responseStatus, Pageable pageable);

    /**
     * 多条件分页查询访问日志（排除管理员请求）
     *
     * @param apiKeyId       API Key ID过滤
     * @param startTime      开始时间
     * @param endTime        结束时间
     * @param clientIp       客户端IP过滤
     * @param responseStatus 响应状态过滤
     * @param pageable       分页参数
     * @return 访问日志分页结果
     */
    Page<AccessLog> getAccessLogsExcludingAdmin(Long apiKeyId, LocalDateTime startTime, LocalDateTime endTime,
                                                String clientIp, Integer responseStatus, Pageable pageable);

    /**
     * 搜索访问日志
     *
     * @param keyword  关键字
     * @param pageable 分页参数
     * @return 访问日志分页结果
     */
    Page<AccessLog> searchAccessLogs(String keyword, Pageable pageable);

    /**
     * 获取总访问次数
     *
     * @return 总访问次数
     */
    long getTotalAccessCount();

    /**
     * 获取今日访问次数
     *
     * @return 今日访问次数
     */
    long getTodayAccessCount();

    /**
     * 获取成功率
     *
     * @return 成功率（百分比）
     */
    double getSuccessRate();

    /**
     * 获取平均响应时间
     *
     * @return 平均响应时间（毫秒）
     */
    double getAverageResponseTime();

    /**
     * 获取热门API Key统计
     *
     * @param limit 返回数量限制
     * @return 热门API Key列表
     */
    List<Map<String, Object>> getTopApiKeys(int limit);

    /**
     * 获取热门访问路径统计
     *
     * @param limit 返回数量限制
     * @return 热门路径列表
     */
    List<Map<String, Object>> getTopPaths(int limit);

    /**
     * 获取热门客户端IP统计
     *
     * @param limit 返回数量限制
     * @return 热门IP列表
     */
    List<Map<String, Object>> getTopClientIps(int limit);

    /**
     * 获取每日访问统计
     *
     * @param days 统计天数
     * @return 每日统计列表
     */
    List<Map<String, Object>> getDailyStats(int days);

    /**
     * 获取每小时访问统计
     *
     * @param hours 统计小时数
     * @return 每小时统计列表
     */
    List<Map<String, Object>> getHourlyStats(int hours);

    /**
     * 导出访问日志为CSV
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param apiKeyId  API Key ID过滤
     * @param clientIp  客户端IP过滤
     * @return CSV数据
     */
    String exportToCsv(LocalDateTime startTime, LocalDateTime endTime, Long apiKeyId, String clientIp);

    /**
     * 根据客户端IP分页查询访问日志
     *
     * @param clientIp 客户端IP
     * @param pageable 分页参数
     * @return 分页结果
     */
    Page<AccessLog> findByClientIp(String clientIp, Pageable pageable);

    /**
     * 根据响应状态分页查询访问日志
     *
     * @param responseStatus 响应状态
     * @param pageable       分页参数
     * @return 分页结果
     */
    Page<AccessLog> findByResponseStatus(Integer responseStatus, Pageable pageable);

    /**
     * 获取访问日志统计信息
     *
     * @return 统计信息Map
     */
    Map<String, Object> getAccessLogStats();
}